package ar.com.larreta.colegio.procesos.pasos;

import java.util.Iterator;
import java.util.Map;

import org.apache.log4j.Logger;

import ar.com.larreta.colegio.entidades.Alumno;
import ar.com.larreta.colegio.entidades.Anio;
import ar.com.larreta.colegio.entidades.Division;
import ar.com.larreta.colegio.entidades.Nivel;
import ar.com.larreta.entidades.TipoDocumento;
import ar.com.larreta.excepciones.Excepcion;
import ar.com.larreta.procesos.Entrada;
import ar.com.larreta.procesos.PasoConDAO;
import ar.com.larreta.utilidades.UtilidadesTextos;

import com.healthmarketscience.jackcess.Database;


public class ImportarAlumnosDeAccess extends PasoConDAO {

	protected static Logger logger = Logger.getLogger(ImportarAlumnosDeAccess.class);

	public static final String TABLA_ALUMNO = "Alumnos";
	
	public static final String ID_ALUMNO = "IdAlumno";
	public static final String APELLIDOS = "Apellidos";
	public static final String NOMBRES = "Nombres";
	public static final String SECTOR = "Sector";
	public static final String ANIO = "Anio";
	public static final String DIVISION = "Division";
	public static final String DNI = "DNI";

	@Override
	protected void accion() throws Excepcion {
		logger.debug("Comenzando import de Alumnos desde archivo Access");
		
		Entrada entrada = entradas.get(AbrirAccess.ACCESS);
		Database database = (Database) entrada.getValor();
		
		try {
			Iterator it = database.getTable(TABLA_ALUMNO).iterator();

			while (it.hasNext()) {
				Map<String, Object> campos = (Map<String, Object>) it.next();
				Alumno alumno = new Alumno();
				alumno.setId(((Integer) campos.get(ID_ALUMNO)).longValue());
				alumno.setApellido(UtilidadesTextos.getPrimerasLetrasEnCapital((String) campos.get(APELLIDOS)));
				alumno.setNombre(UtilidadesTextos.getPrimerasLetrasEnCapital((String) campos.get(NOMBRES)));

				setCurso(campos, alumno);
				setDocumento(campos, alumno);

				grabar(alumno);

			}
		} catch (Exception e) {
			logger.error("Ocurrio un error durante la importacion.", e);
		}
		
		salidas.put("access", database);
		logger.debug("Fin de la importacion de Alumnos del archivo de Access");
	}

	public void grabar(Alumno alumno) {
		try {
			if (!getDao().existe(Alumno.class, alumno.getId())) {
				getDao().grabar(alumno);
			}
			logger.debug("Se almaceno Alumno #" + alumno.getId() + ": "	+ alumno.getApellido() + "," + alumno.getNombre());
		} catch (Exception e) {
			logger.debug("Ya se encontraba almacenado el Alumno #" + alumno.getId() + ": " + alumno.getApellido() + ","	+ alumno.getNombre());
		}
	}

	private void setCurso(Map<String, Object> campos, Alumno alumno) {
		setNivel(campos, alumno);

		Anio anio = new Anio();
		anio.setDescripcion(((Integer) campos.get(ANIO)).toString());
		alumno.setAnio(anio);

		Division division = new Division();
		division.setDescripcion(((String) campos.get(DIVISION)));
		alumno.setDivision(division);
	}

	private void setDocumento(Map<String, Object> campos, Alumno alumno) {
		TipoDocumento tipoDocumento = new TipoDocumento();
		tipoDocumento.setDescripcion(DNI);
		alumno.setTipoDocumento(tipoDocumento);
		Double dni = (Double) campos.get(DNI);
		if (dni != null) {
			alumno.setNumeroDocumento(dni.toString());
		}
	}

	private void setNivel(Map<String, Object> campos, Alumno alumno) {
		alumno.setNivel(ImportarAlumnosDeAccess.getNivel((Short) campos.get(SECTOR)));
	}
	
	public static Nivel getNivel(Short numeroNivel) {
		switch (numeroNivel) {
		case 0:
			return Nivel.JARDIN;
		case 1:
			return Nivel.PREESCOLAR;
		case 2:
			return Nivel.PRIMARIO;
		case 3:
			return Nivel.SECUNDARIO;
		default:
			return null;
		}
	}
	

}
